package fr.template.www.presentation.managedbean;

import fr.template.www.facade.AdresseDto;
import fr.template.www.facade.InformationManquanteExceptionException;
import fr.template.www.facade.MotDePasseIncorrectExceptionException;
import fr.template.www.facade.UtilisateurDto;
import fr.template.www.facade.UtilisateurInexistantExceptionException;
import fr.template.www.facade.WsFacade;
import fr.template.www.facade.WsFacade_Service;
import fr.template.www.presentation.bean.AdresseBean;
import fr.template.www.presentation.bean.UtilisateurBean;
import fr.template.www.presentation.constantes.EnumCivilite;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedProperty;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.xml.ws.WebServiceRef;

/**
 * ManagedBean de gestion d'utilisateur et de login
 * @author alexandre & léo
 */
@Named(value = "mbComptes")
@SessionScoped
public class ComptesManagedBean implements Serializable {

    @WebServiceRef(wsdlLocation = "WEB-INF/wsdl/localhost_8080/WsFacade/WsFacade.wsdl")
    private WsFacade_Service service;
    
    @ManagedProperty(value="#{mbSiteProperties}")
    private SitePropertiesBean siteProperties;

    // Utilisateur courant
    private UtilisateurBean utilisateur = new UtilisateurBean();
    private AdresseBean adresse = new AdresseBean();
   // private UtilisateurDto utilisateurCourrant; // ma variable de session qui indique qui je suis
    
//    private List<CiviliteDto> listeCivilite ;
    private List<String> listeCivilites = new ArrayList<>();
    private String checkMdp;
    
    

    /**
     * Default constructeur Creates a new instance of ComptesManagedBean
     */
    public ComptesManagedBean() {
        this.listeCivilites = new ArrayList<>();
        this.listeCivilites.add(EnumCivilite.MONSIEUR.name());
        this.listeCivilites.add(EnumCivilite.MADAME.name());
    }
    
    // =================================================  //
    //                      METHODES                      //
    // =================================================  //

    /**
     * Connexion via le WebService dédié
     * @return rien, pour redirection sur la page courrante
     */
    public String connexion() {
        WsFacade webService = service.getWsFacadePort();
            try {
                UtilisateurDto utilisateurDto = webService.login(
                        utilisateur.getEmail(),
                        utilisateur.getPassword());
                if (utilisateurDto.getIdUtilisateur()!=null){
                    
                this.utilisateur.setAdresses(utilisateurDto
                        .getAdresse());
                this.utilisateur.setCivilite(utilisateurDto.getCivilite()
                        .getCivilite());
                this.utilisateur.setEmail(utilisateurDto.getEmail());
                this.utilisateur.setNom(utilisateurDto.getNom());
                this.utilisateur.setTypeUtitilisateur(
                        utilisateurDto.getTypeUtilisateur());
                this.utilisateur.setPrenom(utilisateurDto.getPrenom());
                 this.utilisateur.setConnecte(Boolean.TRUE);
                }
                
            } catch (InformationManquanteExceptionException|
                    MotDePasseIncorrectExceptionException |
                    UtilisateurInexistantExceptionException ex){
                FacesContext context = FacesContext.getCurrentInstance();   
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", ex.getMessage()));  
                // Logger.getLogger(ComptesManagedBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        return "";
    }

    /**
     * Déconnexion de l'utilisateur courant
     * @return rien, pour redirection sur la page courante
     */
    public String deconnexion() {
        this.utilisateur = new UtilisateurBean();
        return "";
    }

    /**
     * Indique si on est connecté
     * @return état de connexion
     */
    public boolean isConnecte() {
        return this.utilisateur.isConnecte() ;
    }

    /**
     * Crée un nouvel utilisateur à partir des informations saisies dans la page
     * @return index.xhtml pour redirection sur l'accueil du site
     */
    public String creerUtilisateur(String site) {
        AdresseDto adresseUtilisateur = new AdresseDto();
        adresseUtilisateur.setCodePostal(adresse.getCodePostal());
        adresseUtilisateur.setComplementAdresse(adresse.getComplementAdresse());
        adresseUtilisateur.setPays(adresse.getPays());
        adresseUtilisateur.setRue(adresse.getRue());
        adresseUtilisateur.setTitreAdresse("Par défaut");
        adresseUtilisateur.setVille(adresse.getVille());
        adresseUtilisateur.setVisible(Boolean.TRUE);

        UtilisateurDto nouvelUtilisateur = new UtilisateurDto();
        nouvelUtilisateur.setEmail(utilisateur.getEmail());
        nouvelUtilisateur.setMotDePasse(utilisateur.getPassword());
        nouvelUtilisateur.setNom(utilisateur.getNom());
        nouvelUtilisateur.setPrenom(utilisateur.getPrenom());
//        nouvelUtilisateur.setSite(SitePropertiesBean.chargeProperties());
                
            try {
                UtilisateurDto utilisateurDto = 
                        ajouterClient(nouvelUtilisateur, adresseUtilisateur);
              if (utilisateurDto.getIdUtilisateur() != null) {
                  connexion();
                  
                  // TODO Problème avec l'injection de dépendance
                  // siteProperties est null lors de l'appel
                  // c'est cet attribut qui renvoi un null properties
                  // Voir si en paramétrant bean.xml ca fonctionne
//                  siteProperties
//                          .setPageCentrale("includes/confirmationCreationCompte.xhtml");
              }
            } catch (InformationManquanteExceptionException ex) {
                FacesContext context = FacesContext.getCurrentInstance();   
                context.addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                        "Erreur", ex.getMessage()));
            }
        return "";
    }

    /**
     * appel du ServiceWeb pour la création d'un utilisateur
     * @param nouvelUtilisateur
     * @return nouvel utilisateur créer
     */
    private UtilisateurDto ajouterClient(UtilisateurDto nouvelUtilisateur,
            AdresseDto adresse) throws InformationManquanteExceptionException {
        WsFacade webService = service.getWsFacadePort();
        return webService.ajoutClient(nouvelUtilisateur,adresse, 
                utilisateur.getCivilite());
    }

    // =================================================  //
    //                    GETTER - SETTER                 //
    // =================================================  //
    
    /**
     * Obtient l'utilisateur connecté
     * @return 
     */
    public UtilisateurBean getUtilisateur() {
        return utilisateur;
    }

    /**
     * Definit l'utilisateur connecté
     * @param utilisateur 
     */
    public void setUtilisateur(UtilisateurBean utilisateur) {
        this.utilisateur = utilisateur;
    }

    /**
     * Obtient une adresse
     * @return 
     */
    public AdresseBean getAdresse() {
        return adresse;
    }

    /**
     * Definie une adresse
     * @param adresse
     */
    public void setAdresse(AdresseBean adresse) {
        this.adresse = adresse;
    }

    /**
     * Obtient la liste des civilités
     * @return liste de civilité
     */
    public List<String> getListeCivilites() {
        return listeCivilites;
    }

    /**
     * Obtient la chaine de caractère utilisée pour 
     * la vérification du mot de passe lors de la 
     * création d'un compte utilisateur
     * @return mot de passe
     */
    public String getCheckMdp() {
        return checkMdp;
    }

    /**
     * Défini le mot de passse de verification utilisé
     * pour la création d'un comtpe utilisateur
     * @param checkMdp 
     */
    public void setCheckMdp(String checkMdp) {
        this.checkMdp = checkMdp;
    }

    /**
     * Necessaire à l'injection de dépendance
     * @param siteProperties 
     */
    public void setSiteProperties(SitePropertiesBean siteProperties) {
        this.siteProperties = siteProperties;
    }

    public SitePropertiesBean getSiteProperties() {
        return siteProperties;
    }
}
